package thread;
//内存可见性
import java.util.Scanner;
//在这个代码中,我们期望
//通过t2输入一个不为0的整数,结束t1线程1
public class ThreadDemo22 {
    private static volatile int flag = 0;//volatile关键字核心功能:1.保持内存可见性 2.禁止指令重排序
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            while (flag==0){
                /*try {
                    Thread.sleep(1000);//加上就能正确执行逻辑
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                */


            }
            System.out.println("t1结束");

        });
        Thread t2 = new Thread(()->{
            System.out.println("请输入flag的值");
            Scanner scanner = new Scanner(System.in);
            flag = scanner.nextInt();

        });
        t1.start();
        t2.start();
        //实际输入一个非零值时,t1并没有结束
        //while循环速度很快,load操作每次的执行结果都是一样的,输入的值已经被覆盖了,load操作的开销远远高于条件跳转
        //内存可见性高度依赖于编译器优化的具体实现


    }
}
